<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>一阶微分方程的初等解法</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="../../css/note.css" />
</head>
<body>

<h2>变量分离方程</h2>

<p class="example">
    <b>Logistic 方程</b>
    `dy/dx = r y (1-y)`, `r` 为常数.
</p>

<p class="solution">
    <span class="formula">
        <span class="fix-left">分离变量,</span>
        `dy/(y(1-y)) = r dx`,<br/>
        <span class="fix-left">两边积分,</span>
        `int (1/y + 1/(1-y)) dy = r x`,<br/>
        `ln |y/(1-y)| = r x + c_1`,<br/>
        `y/(1-y) = c_2 "e"^(r x)`,<br/>
    </span>
    即
    <span class="formula">
        `y = (1 + c "e"^(-r x))^-1`.
    </span>
    特别地, sigmoid 函数 `sigma(x) = (1+"e"^-x)^-1` 满足 Logistic 方程.
    <canvas id="img-sigmoid" width="450" height="150"></canvas>
    Logistic 方程最早出现于人口问题中, 它的图形是一条 S 形曲线.
    该函数可用于动画平滑过渡, 或机器学习中的激活函数.
</p>

<ol class="example">
    <b>齐次方程</b>
    <li>`dy/dx = f(y/x)`;</li>
    <li>`dy/dx = (a_1 x + b_1 y + c_1)/(a_2 x + b_2 y + c_2)`,
        `|a_1, b_1; a_2, b_2| != 0`.
    </li>
</ol>

<ol class="solution">
    <li>令 `y = ux`, 则 `dy = udx + x"d"u`. 原方程化为
        `u + x("d"u)/dx = f(u)`. 这是变量分离方程.
    </li>
    <li>令 `alpha, beta` 是
            `{a_1 alpha + b_1 beta + c_1 = 0;
            a_2 alpha + b_2 beta + c_2 = 0 :}`
        的解, 再作代换 `{x = X + alpha; y = Y + beta :}`,
        即化为齐次方程.
    </li>
</ol>

<h2>线性方程</h2>

<span class="formula">
    `dy/dx = p(x)y + q(x)`.
</span>

<p> 先用分离变量法解齐方程 `dy/dx = p(x) y`, 得通解
    `y = ce^(int p(x) dx)`, 再利用<b>常数变易法</b>,
    设 `c = c(x)` 是 `x` 的函数,
    将通解代入原方程比较, 得 `c'(x) = q(x) e^(-int p(x) dx)`,
    积分得到 `c(x)` 的表达式.
</p>

<h3>Bernoulli 方程</h3>

<span class="formula">
    `dy/dx = p(x)y + q(x)y^n`, `quad n ge 2`.
</span>

<p> 显然 `y = 0` 是一个特解. `y != 0` 时, 两边同除以 `y^n`, 得
        `y^(-n) dy/dx = p(x) y^(1-n) + q(x)`.
    再令 `z = y^(1-n)` 化为线性方程.
</p>

<h2>恰当微分方程</h2>

<span class="formula">
    `M(x, y) dx + N(x, y) dy = 0`.
</span>

<ol>
    <li>如果方程满足 `(del M)/(del y) = (del N)/(del x)`,
        此时存在二元函数 `f(x, y)`, 使 `"d"f = M dx + N dy`,
        原方程就称为<b>恰当微分方程</b>, 通解为 `f(x, y) = c`.
    </li>
    <li>若上述条件不满足, 但方程两边同乘以 `mu(x, y)` 后有
        `(del(mu M))/(del y) = (del(mu N))/(del x)`,
        就称 `mu` 是方程的<b>积分因子</b>.
    </li>
    <li>若上述的 `mu` 只与 `x` 有关, 即 `(del mu)/(del y) = 0`, 则
        `N ("d" mu)/dx = ( (del M)/(del y) - (del N)/(del x) ) mu`,
        可以用分离变量法求出 `mu`. 注意验证 `mu = 0` 的情形.
    </li>
</ol>

<p class="remark">
    <b>一些常见的全微分</b>
    <span class="formula">
        `"d"(xy) = ydx + xdy`, <br/>
        `"d"(x/y) = (ydx - xdy)/y^2`, <br/>
        `"d"(x^a y^b) = a x^(a-1) y^b dx + b y^(b-1) x^a dy`.
    </span>
</p>

<h2>隐式方程</h2>

<!-- <p>令 `p = y'`.</p> -->

<p class="example">
  <b>追赶问题</b>
  [来自 <a href="https://www.zhihu.com/question/49115473">知乎</a>]
  `xOy` 平面上, 兔子从原点出发, 以速度 `a gt 0` 沿 `x` 轴正方向运动,
  猎犬从 `(0, 1)` 出发以速度 `b gt a` 追赶兔子,
  猎犬的速度方向始终指向兔子, 求猎犬的运动轨迹和相遇时间.
</p>

<canvas id="img-hound" height="200" width="300"></canvas>

<p class="solution">
  在 `t` 时刻, 兔子的坐标为 `a t`.
  设此时猎犬的坐标为 `(x, y)`, 考虑速度的大小和方向, 我们有
  <span class="formula">
    `dy/dx = y/(x-a t)`,
    `quad (dx/dt)^2 + (dy/dt)^2 = b^2`.
  </span>
  第一式化为 `y dx/dy = x - a t`, 两边对 `y` 微分得
  <span class="formula">
    `dx/dy + y ("d"^2 x)/dy^2 = dx/dy - a dt/dy`, 即
    `y ("d"^2 x)/dy^2 = - a dt/dy`.
  </span>
  第二式两边同乘 `(dt/dy)^2` 得
  <span class="formula">
    `(dx/dy)^2 + 1 = b^2 (dt/dy)^2`,
  </span>
  原问题中 `y` 随 `t` 减小, 故 `dt/dy = -1/b sqrt((dx/dy)^2 + 1)`.
  代入前式, 得到不显含 `t` 的方程
  <span class="formula">
    `y ("d"^2 x)/dy^2 = a/b sqrt((dx/dy)^2 + 1)`.
  </span>
  令 `r = a//b`, `p = dx/dy` 得
  <span class="formula">
    `y ("d"p)/dy = r sqrt(p^2+1)`,
  </span>
  分离变量, 解得 `p = sinh(r ln y + c)`.
  代入 `t = 0` 时 `x = 0, y = 1, p = 0` 得 `c = 0`, 故
  <span class="formula">
    `p = (y^r - y^-r)/2`.
  </span>
  积分得
  <span class="formula">
    `x = 1/2((y^(1+r)-1)/(1+r) - (y^(1-r)-1)/(1-r))`.
  </span>
  这就是猎犬的轨迹.
  为求相遇时间, 令 `y = 0` 解得 `x = r/(1-r^2)`, 于是 `t = x/a`.
</p>

<p class="solution">
  仅求相遇时间: 设二者速度夹角为 `theta`, 0 时刻距离为 `D`.
  于是
  <span class="formula">
    `int_0^T (a cos theta - b) dt = -D`;
  </span>
  又, 在水平方向上,
  <span class="formula">
    `int_0^T b cos theta dt = a T`.
  </span>
  两式消去积分项, 解得 `T = (D b)/(b^2-a^2)`.
</p>

<script src="../../js/note.js?type=math"></script>
<script src="../../js/plot.js"></script>
<script>
new Plot('img-sigmoid', {xmin: -3, xmax: 3, ymin: -0.5, ymax: 1.5}).axis()
    .plot(x => 1/(1+Math.exp(-x)));

const r = 0.9
new Plot('img-hound')
    .geometry({ xmin: 0, xmax: 5, ymin: -0.1, ymax: 1 })
    .axis()
    .plot(y => ((y**(1+r)-1)/(1+r) - (y**(1-r)-1)/(1-r))/2, y => y,
        { min: 0, max: 1, continuity: Infinity })
</script>
</body>
</html>

